
#include "CondG.h"
#include "Common/TableDataEx/DuplicateCfg.h"


CondG::CondG() :m_pDuplicate(nullptr), m_pVecCond(nullptr), m_result(-1), m_finish(false), m_contiSec(0)
{
	m_winCamp = EDupCampType_None;
}

CondG::~CondG()
{

}

bool CondG::init(IDuplicate *pDuplicate, const VEC_INT32 *pCond, const string &strSubCond)
{
	if (nullptr == pDuplicate || nullptr == pCond)
	{
		return false;
	}
	_UNUSE(strSubCond);
	m_pVecCond = pCond;
	m_pDuplicate = pDuplicate;
	//这里设置一个默认时间
	m_contiSec = DUP_WITHSTAND_SEC;
	return true;
}

void CondG::uninit()
{
	m_pDuplicate = nullptr;
	m_pVecCond = nullptr;
	m_finish = false;
	m_result = -1;
	m_winCamp = EDupCampType_None;
	m_contiSec = 0;
}

bool CondG::finishCond()
{
	return m_finish;
}

int32_t CondG::limitSec()
{
	return m_contiSec;
}

int32_t CondG::result()
{
	return m_result;
}

void CondG::setContiTime(int32_t sec)
{
	m_contiSec = sec;
}

void CondG::condUpdate()
{
	if (m_finish)
	{
		return;
	}
	m_result = checkCond();
	if (RET_SUCCESS == m_result || RET_FAIL == m_result)
	{
		m_finish = true;
	}
}

int32_t CondG::checkCond()
{
	if (nullptr == m_pVecCond || nullptr == m_pDuplicate)
	{
		return -1;
	}

	int32_t ret = -1;
	uint64_t curTime = g_GetGlobalServerTime()->UnixSec();
	int32_t interSec = (int32_t)(curTime - m_pDuplicate->StartBrushTime());
	int32_t injectNum = 0;
	int32_t surviveNum = 0;
	m_pDuplicate->GetPestilenceNum(injectNum, surviveNum);
	/*
	1，指定时间内消灭指定怪物序列，才能通关；超时失败
	2，指定时间内消灭所有怪物，才能通关；超时失败
	3，消灭所有怪物，才能通关；塔被怪物消灭失败
	4，达到指定时间点，怪物传送的数量小于目标值；怪物传送的数量达到目标值，或有BOSS进行传送，失败
	6，消灭场景内所有还存在的怪物，胜利；	怪物传送的数量达到目标值，或有BOSS进行传送，失败
	7，瘟疫之城的副本条件
	（1）生还者胜利
	对抗进行了15分钟，副本内仍有生还者存在，倒地的生还者也包括在内
	在对抗过程中，副本内没有感染者存在（包括感染者离线/主动离开副本）
	（2）感染者胜利
	活动结束前，副本内已没有生还者，所有生还者都被转化为感染者，包括生还者离线/主动离开的情况

	1，限制时间，怪物1的ID，怪物2的ID，……
	2，限制时间
	3，塔的ID
	4，限制时间，传送区域ID，目标值，BOSS1的ID，BOSS2的ID，……
	6，传送区域ID，目标值，BOSS1的ID，BOSS2的ID
	*/

	if (injectNum <= 0)//在对抗过程中，副本内没有感染者存在（包括感染者离线 / 主动离开副本）
	{
		m_winCamp = EDupCampType_Survive;
	}
	else if (surviveNum <= 0) //活动结束前，副本内已没有生还者，所有生还者都被转化为感染者，包括生还者离线 / 主动离开的情况
	{
		m_winCamp = EDupCampType_Inject; 
	}
	else if (interSec >= m_contiSec)
	{
		if (surviveNum > 0) //对抗进行了15分钟，副本内仍有生还者存在
		{
			//生还者胜利
			m_winCamp = EDupCampType_Survive;
		}
	}

	//胜利
	if (m_winCamp == EDupCampType_Survive || m_winCamp == EDupCampType_Inject)
	{
		ret = RET_SUCCESS;
	}


	return ret;
}
